package pojo;

import java.util.ArrayList;
import java.util.List;

import dao.AlunoDaoImp;
import dao.NotaAtividadeDao;

/**
 * Classe que modela um Registro no sistema
 * 
 * Um registro é a classe de ligação entre Aluno e Turma
 *
 * @version 30/01/2013
 *
 * @author Rodrigo Chaves
 * @author Rodrigo Caputo
 * @author Lucas Chaves
 * @author Giovanni Sá
 */

public class AlunoTurma {
	
	private int id;
	private int turmaId;
	private int alunoId;
	private int faltas;
	private float notaFinal;
	/**
	 * Lista com Ids dos RegistroAtividade(s) que a auxiliam no
	 * salvamento das notas de cada aluno em determinada Atividade 
	 *  
	 */
	List<Integer> listaNotaAtividades;
	
	public AlunoTurma(int id, Turma turma, Aluno aluno) {
		this(id,turma.getId(),aluno.getId());
		aluno.addRegistro(this.getId());
		turma.addRegistro(this.getId());
	}
	public AlunoTurma(int id, int turmaId, int alunoId) {
		this.id = id;
		this.alunoId = alunoId;
		this.turmaId = turmaId;
		listaNotaAtividades = new ArrayList<Integer>();
	}
	public AlunoTurma(int id, int turmaId, int alunoId, int faltas,
			float notaFinal, List<Integer> registroAtividades) {
		
		this(id, turmaId, alunoId);
		this.faltas = faltas;
		this.notaFinal = notaFinal;
		this.listaNotaAtividades = registroAtividades;
	}
	public int getFaltas() {
		return faltas;
	}
	public void setFaltas(int faltas) {
		this.faltas = faltas;
	}
	public float getNotaFinal(NotaAtividadeDao notaAtividade) {
		this.atualizarNotaFinal(notaAtividade);
		return notaFinal;
	}
	public int getId() {
		return id;
	}
	public int getAlunoId() {
		return this.alunoId;
	}
	public int getTurmaId() {
		return this.turmaId;
	}
	/**
	* Converte o objeto para uma string de modo que ele possa ser 
	* reconstruido com os mesmos valores
	* 
	* Usado na escrita em arquivo
	*/
	public String toStringIDs() {
		int nAtividades = this.listaNotaAtividades.size();
		String sAtividades = new String();
		for (int i = 0; i < this.listaNotaAtividades.size(); i++) {
			sAtividades += "\t" + this.listaNotaAtividades.get(i);
		}
		return String.format("%d\t%d\t%d\t%d\t%.2f\t%d%s", id, turmaId, alunoId, faltas,
				notaFinal, nAtividades, sAtividades);
	}
	public String toString(AlunoDaoImp alunoDao) {
		String aluno = alunoDao.get(this.getAlunoId()).getNome();
		return String.format("ID: %d\tAluno: %s\tTurma ID: %d\tNota Final: %f\t Faltas: %d",
				id, aluno, turmaId, notaFinal, faltas);
	}
	public boolean addRegistroAtividade(NotaAtividade regAtividade){
		this.listaNotaAtividades.add(new Integer(regAtividade.getId()));
		return false;
	}
	@Override
	public boolean equals(Object o){

         if((o instanceof AlunoTurma) && 
        		 (((AlunoTurma)o).getId() == this.getId()) ){
        	 return true;
         } else {
        	 return false;
         }
	}
	public NotaAtividade getRegistroAtividade(Atividade atividade,NotaAtividadeDao regAtividadeDao) {
		for (NotaAtividade regAtividade : regAtividadeDao.getByAtividade(atividade)) {
			if(this.hasRegAtividade(regAtividade)){
				return regAtividade;
			}
		}
		return null;
	}
	public boolean atualizarNotaFinal(NotaAtividadeDao notaAtividade){
		this.notaFinal=0;
		for (Integer idNotaAtividade :listaNotaAtividades) {
			this.notaFinal += notaAtividade.getById(idNotaAtividade.intValue()).getNota();
		}
		return true;
	}
	
 	private boolean hasRegAtividade(NotaAtividade regAtividade) {
		for (Integer interator : this.listaNotaAtividades) {
			if(interator.intValue() == regAtividade.getId()){
				return true;
			}
		}
		return false;
	}
}
